#include "Test1_var.hh"
#include "plato_node_factory.hh"
#include <unordered_map>
#include <string>

static std::unordered_map<plato::VarID, std::size_t> var_creator_size_map = {
};


namespace plato { namespace Test1 {

using VarCreator = VariablePtr(*)(DomainPtr, plato::PlatoVariableSyncType);

static std::unordered_map<plato::VarID, VarCreator> var_creator_map = {
};

}}

auto plato::Test1::create_variable(plato::VarID var_id, DomainPtr domain_ptr, plato::PlatoVariableSyncType sync_type) -> VariablePtr {
  auto it = var_creator_map.find(var_id);
  if (it == var_creator_map.end()) { return nullptr; }
  return (*(it->second))(domain_ptr, sync_type);
}

auto plato::Test1::query_variable_size(plato::VarID var_id) -> std::size_t {
  auto it = var_creator_size_map.find(var_id);
  if (it == var_creator_size_map.end()) { return 0; }
  return it->second;
}

extern auto add_var_creator(const char* name, VarCreatorFunc func, VarCreatorSizeFunc size_func) -> bool;
bool res_Test1 = add_var_creator("Test1", plato::Test1::create_variable, plato::Test1::query_variable_size);
